import 'dart:convert';

import 'package:ai_model/generated/json/base/json_convert_content.dart';

class NetData<T> {
  String? code;
  String? desc;
  T? data;

  bool isSuccess;
  String message;

  NetData({this.code, this.desc, this.data})
      : isSuccess = (code == none),
        message = (desc ?? "后台接口描述为空");

  /// 错误码
  /// 正常
  static const String none = "0";

  /// 网络错误
  static const String networkError = "100";

  /// App不是最新版本
  static const String version = "8888";

  /// 需短信验证二次验证
  static const String needVerify = "9991";

  /// 登陆过期
  static const String tokenExpired = "9999";

  /// 版本过低，不能实名
  static const String appVersionLow = "1001";

  /*
   * 从JSON数据创建NetData实例的工厂方法。
   *
   * @param data 可以是JSON字符串或JSON映射对象。如果是字符串，将首先将其解析为JSON映射对象。
   * @return 返回一个NetData实例，包含解析后的数据、状态码和消息。
   */
  factory NetData.fromJson(data) {
    // 如果输入数据是字符串类型，则先解析为JSON对象再处理
    if (data is String) {
      return NetData.fromJson(jsonDecode(data));
    } else if (data is Map) {
      // 从数据中提取状态码和消息，兼容不同的键名
      var code = (data['code'] ?? data["err"]).toString();
      var msg = data['message'] ?? data["desc"];
      // 返回包含解析后数据、状态码和消息的NetData实例
      var tData = JsonConvert.fromJsonAsT<T>(data);
      return NetData<T>(code: code, desc: msg, data: tData);
    } else {
      // 对于非字符串和非映射类型的输入，返回一个包含错误状态的NetData实例
      return NetData<T>(code: none, desc: "未知错误");
    }
  }
}
